import random;
import pygame;
from PlaneSprite import *;


'''
    1.初始化游戏
    2.游戏操作监听
    3.创建游戏窗口
    4.创建背景
        背景滚动
    5.创建英雄
    6.创建敌人
'''
class GameMain(object):

    # 游戏初始化
    def __init__(self):


        pygame.display.set_caption('Python 飞机大战')

        self.bg_index = random.randint(0,len(BG_LIST)-1); # 当前背景皮肤索引

        # 创建游戏窗口
        self.window = pygame.display.set_mode(WINDOW_RECT.size);

        ''' 加载音乐 '''
        pygame.mixer.init()
        track = pygame.mixer.music.load(BG_MUSI_PATH)  # 加载音乐
        pygame.mixer.music.play()  # 播放

        # 初始化
        pygame.init();



    # 游戏开始
    def start_game(self):

        # 创建时钟对象，来实现控制循环内部执行频率
        time = pygame.time.Clock();

        # 创建精灵，精灵组
        self.create_sprite();

        ''' 创建定时器 '''
        # 绑定敌人出现事件
        pygame.time.set_timer(CREATE_ENEMY_EVENT,1000);
        # 绑定发射子弹事件
        pygame.time.set_timer(FIRE_BULLET_EVENT,300);



        while True:
            # 刷新频率 一秒执行多少次
            time.tick(60);

            # 更新精灵
            self.update_sprite();

            # 事件监听
            self.loop_event();

            # 碰撞监听
            self.loop_collide();

            pygame.display.update();



    # 游戏结束
    def game_over(self):
        # 退出操作
        print("退出游戏...")
        pygame.quit();
        exit();

    # 监听操作状态
    def loop_event(self):
        # 获取操作监听列表，所有
        for item in pygame.event.get():
            # 点击了关闭按钮
            if item.type == pygame.QUIT:
                # 退出操作
                self.game_over();
            elif item.type == CREATE_ENEMY_EVENT:
                # 创建敌人
                enemy = Enemy();
                self.enemy_group.add(enemy);
            elif item.type == pygame.KEYDOWN:
                # 只能监听一次,按一次触发一次
                pass;
            elif item.type == FIRE_BULLET_EVENT:
                # 发射子弹事件
                self.man.fire();

        # 键盘按下事件，可长按
        keys = pygame.key.get_pressed();

        if keys[pygame.K_RIGHT]:
            # 右
            # self.man.rect.x +=5;
            self.man.speed = 5;
        elif keys[pygame.K_LEFT]:
            # 左
            # self.man.rect.x -=5;
            self.man.speed = -5;
        elif keys[pygame.K_ESCAPE]:
            # esc
            self.game_over();
        else:
            self.man.speed = 0;

    # 碰撞监听
    def loop_collide(self):
        # 检测两个精灵组是否发生碰撞,1 2为精灵组,3 4为是否销毁
        # 子弹&敌人
        pygame.sprite.groupcollide(self.man.bullet_group,self.enemy_group,True,True);


        # 检测精灵与精灵组是否发生碰撞,1 2为精灵组,3 4为是否销毁
        #敌人&英雄
        enemys = pygame.sprite.spritecollide(self.man,self.enemy_group,True);

        if len(enemys) > 0:
            self.man.kill();

            self.game_over();



    # 创建精灵
    def create_sprite(self):

        # 绘制背景
        bg = Background(BG_LIST[self.bg_index])
        # 绘制背景2
        bg2 = Background(BG_LIST[self.bg_index])
        bg2.rect.y = -bg2.rect.height;

        # 背景
        self.bg_group = pygame.sprite.Group(bg,bg2);

        # 英雄
        self.man = Man();
        self.man_group = pygame.sprite.Group(self.man);

        # 敌人
        self.enemy_group = pygame.sprite.Group();



    # 更新精灵
    def update_sprite(self):
        self.bg_group.update();
        self.bg_group.draw(self.window);

        self.man_group.update();
        self.man_group.draw(self.window);

        self.enemy_group.update();
        self.enemy_group.draw(self.window);

        self.man.bullet_group.update();
        self.man.bullet_group.draw(self.window);


if __name__ == '__main__':
    main = GameMain();
    main.start_game();
